<template>
  <div class="app-container">
    <div class="container">
      <h2>正则表达式帮助说明</h2>

      <p>1. 判断整个文本中是否包含“通知”</p>
      <pre>/通知/is</pre>
      <p>
        ——在PHP等语言中<code>/ /</code>表示里面的内容是正则表达式，<code>is</code>是修饰条件，<code>i</code>表示不区分大小写;
        <code>s</code>表示可以跨行全文搜索，不带的话只在一行内检索。
      </p>

      <hr>

      <p>2. 捕获（抽取）全文中“通知”和“为”中间的内容</p>
      <pre>/通知(.*?)为/is</pre>
      <p>——<code>（）</code>括号里的内容表示要捕获（抽取）的内容。</p>
      <p>——<code>.</code>表示任意单个字符（除了换行符）。<code>*</code>表示前面的字符可以重复零次或多次。</p>
      <p>
        ——<code>?</code>代表懒惰，即尽可能少地匹配字符。这意味着它会匹配直到遇到第一个“为”字停止，而不是尽可能多地匹配。如“通知袁为民为中共常委”，带上<code>?</code>就只出来“袁”，去掉<code>?</code>就出来袁为民
      </p>

      <hr>

      <p>3. 匹配一行文本中“为”前面的内容</p>
      <pre>/(.*?)为/</pre>
      <p>——不带<code>s</code>就限定范围为一行。</p>

      <hr>

      <p>4. 匹配一行文本中“为”后面的内容</p>
      <pre>/为(.+)/</pre>
      <p>——正则表达式中的<code>*</code>和<code>+</code>都是量词，用于指定前面的元素出现的次数，但它们之间存在关键差异：</p>
      <ul>
        <li>
          <code>*</code>（星号）：表示前面的元素可以出现零次或多次。这意味着匹配是可选的，即使前面的元素不存在，整个表达式仍然可以成功匹配。例如，在模式<code>a*</code>中，<code>a</code>可以出现0次、1次、多次或者根本不在字符串中，正则表达式都会视为匹配成功。
        </li>
        <li>
          <code>+</code>（加号）：表示前面的元素必须至少出现一次，但可以出现多次。与<code>*</code>不同，<code>+</code>强制要求其前面的元素至少要有一次出现。在模式<code>a+</code>中，至少需要有一个<code>a</code>存在，而且如果有多个连续的<code>a</code>，则会作为一个整体匹配。
        </li>
      </ul>
      <p>
        简单来说，<code>*</code>允许前面的元素完全不出现，而<code>+</code>则要求至少出现一次。这使得在实际应用中，选择使用<code>*</code>还是<code>+</code>会根据是否要求匹配项为强制存在的条件来决定。
      </p>

      <hr>

      <p>5. 以“为”或“、”开始，以“、”或“。”或“；”结束</p>
      <pre>/(?:为|、)([^、。；]+)/u</pre>

      <hr>

      <p>6. 捕获“免去”和“xxxx年”中间的内容</p>
      <pre>/免去(.*?)[0-9]{4}年/is</pre>
      <p>——<code>[0-9]</code>表示数字，<code>{4}</code>表示重复4次。</p>

      <hr>

      <p>7. 从文章中抽取任意形似“xxxx年xx月生”的内容</p>
      <pre>/([0-9]{4}年([1-9]|1[0-2])月生)/</pre>
      <p>——拓展学习：如果发现有“xxxx年xx月出生”也需要被抽取，可调整为：</p>
      <pre>/([0-9]{4}年([1-9]|1[0-2])月(生|出生))/</pre>
      <p>或</p>
      <pre>/([0-9]{4}年([1-9]|1[0-2])月[出生])/</pre>

      <hr>

      <p>8. 抽取类似于“XX为XXX；”或“XX为XXX。”格式的信息</p>
      <pre>/(\p{Han}+为[^；。]+[；。])/u</pre>
      <p>
        ——以一个或多个中文字符开始，紧跟“为”字，之后是一系列非句号、非分号的字符，最后以句号或分号结束。由于不想要标点符号，所以用<code>\p{Han}+</code>代替前面学的<code>.*</code>，这里的<code>+</code>和前面学的<code>*</code>类似表示重复。
      </p>

      <hr>

      <p>9. 从一行文本中抽取“XX的XXX职务”格式的信息</p>
      <pre>/(\p{Han}+的[^；。]+职务)/u</pre>
      <p>——以一个或多个中文字符开始，紧跟“的”字，之后是一系列非句号、非分号的字符，最后“职务”结束。</p>

      <hr>

      <p>10. 从全文中，匹配任意一段“XXXX当选为XXXXXX。”格式的内容（见ID376号文章）</p>
      <pre>/(.*?当选为.*?)。/is</pre>
    </div>
  </div>
</template>

<style lang="scss" scoped>
.container {
  max-width: 800px;
  margin: 0 auto;
  background-color: #fff;
  padding: 20px;
  box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
h1 {
  font-size: 24px;
  margin-bottom: 20px;
}
p {
  font-size: 18px;
  margin-bottom: 10px;
}
p,
pre {
  margin: 0 0 15px 0;
  line-height: 1.6;
}
pre {
  background-color: #f9f9f9;
  padding: 10px;
  border: 1px solid #ddd;
  white-space: pre-wrap;
  word-wrap: break-word;
}
.note {
  color: #555;
  font-style: italic;
}
</style>

